import type { PixelPoint } from "../commonTypes"
import { Camera } from "../utils/cameraUtil"
import { add, Vec3 } from "../utils/vectorUtil"

/** 定义相机的位置和屏幕的位置 */
const camera = new Camera(
  // 相机位置
  new Vec3(0, 0, 1), //origin
  // 屏幕位置
  new Vec3(-2, -1, -1), //leftBottom
  // 屏幕方向向量
  new Vec3(4, 0, 0).unitVec(), //horizontal
  new Vec3(0, 2, 0).unitVec(), //vertical
)

/**
 * 渲染每个像素
 * @param px 
 * @param width 
 * @param height 
 */
export function renderPixelCamera(
  px: PixelPoint,
  width: number,
  height: number) {
  // 解析颜色和透明度，并进行解构赋值
  [px.r, px.g, px.b, px.a] = [...color(px.x / width, px.y / height), 1]
    .map(px => {
      // 转换0-1的颜色到0-255范围内
      return Math.floor(px * 255.9)
    })
}

function color(_x: number, _y: number) {
  // 将y轴转换为从低到高的数据
  const [x, y] = [_x, 1 - _y]

  // 获取相机到屏幕的光线
  const ray = camera.getRay(x, y)

  // 获得光线的单位方向向量
  const unitDirection = ray.direction.unitVec()
  // 获得光线方向 e1垂直 方向上的百分比，并减半缩减到0-1的范围之内
  const colorPercent = (unitDirection.e1 + 1.0) * 0.5
  // 白颜色强度
  const whiteColor = new Vec3(1, 1, 1).mul(1 - colorPercent)
  // 蓝颜色的强度
  const blueColor = new Vec3(0.3, 0.5, 1).mul(colorPercent)
  // 混合蓝色和白色设置为背景色，得到白色到蓝色的渐变
  const res = add(whiteColor, blueColor)

  return [res.e0, res.e1, res.e2]
}